﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Laba1
{
    class Program
    {  

           static Subject pris = new Subject("ПРИС", new List<Evaluation>());

        static void Main(string[] args)
        {
            List<Evaluation> evaluations = new List<Evaluation>();
            evaluations.Add(new Evaluation(0, 60 - 1, "Неуд"));
            evaluations.Add(new Evaluation(60, 70, "Удовл"));
            evaluations.Add(new Evaluation(71, 84, "Хор"));
            evaluations.Add(new Evaluation(85, 100, "Отл"));
            pris.Evaluations = evaluations;

            List<RatingByDate> listRatings = new List<RatingByDate>();
            listRatings.Add(new RatingByDate(0, 8));
            listRatings.Add(new RatingByDate(2, 6));
            listRatings.Add(new RatingByDate(4, 4));
            var principalOfRating = new PrincipleOfRatingByDate(listRatings);

            pris.AddPracticalTask(20, 12, "Лабораторная работа №1", new DateTime(2013, 3, 1), principalOfRating);
            pris.AddPracticalTask(20, 15, "Лабораторная работа №2", new DateTime(2013, 3, 15), principalOfRating);
            pris.AddPracticalTask(20, 15, "Лабораторная работа №3", new DateTime(2013, 5, 15), principalOfRating);

            pris.AddBoundaryControl("Промежуточный контроль", 20, 15, new DateTime(2013, 4, 1));

            pris.SetFinalControl("Экзамен", 15, 20);

            pris.AddStudent("Иванов И.И.");

            /*pris.Students[0].AddPracticalTask(new DateTime(2013, 2, 27), 10, 3, pris.PracticalTasks[0]);
            pris.Students[0].AddPracticalTask(new DateTime(2013, 3, 10), 10, 10, pris.PracticalTasks[0]);
            Console.Write(pris.Students[0].Tasks[0].Rating);
            Console.ReadKey();*/
            string key = string.Empty;
            int studentIndex;
            while (key != "3")
            {
                showMainMenu();
                key = Console.ReadLine();
                switch (key)
                {
                    case "1":
                        printList(new List<IPrintable>(pris.Students));
                        Console.Write("     Введите индекс студента: ");
                        studentIndex = int.Parse(Console.ReadLine());
                        Console.WriteLine(pris.Students[studentIndex].Name);
                        showStudentMenu(studentIndex);
                        
                        break;
                    case "2":
                        printList(new List<IPrintable>(pris.Students));
                        Console.Write("     Введите индекс студента: ");
                        studentIndex = int.Parse(Console.ReadLine());
                        Console.WriteLine(pris.Students[studentIndex].Name);
                        Console.WriteLine("Сдано");
                        List<Achivement> tasks = pris.Students[studentIndex].Tasks;
                        printList(new List<IPrintable>(from task in tasks where task.Rating >= task.Task.PassingRating select  task));
                        Console.WriteLine("Не сдано");
                        printList(new List<IPrintable>(pris.Students[studentIndex].GetListDebt()));
                        Console.WriteLine(pris.getEvaluation(pris.Students[studentIndex].FinalRating()));
                        break;
                }
            }
            
        }

        private static void showMainMenu()
        {
            Console.WriteLine("1. Выбрать студента");
            Console.WriteLine("2. Получить информацию по студенту");
            Console.WriteLine("3. Выход");
        }
        private static void showStudentMenu(int studentIndex)
        {
            Console.WriteLine("         1. Засчитать лабораторную работу");
            Console.WriteLine("         2. Засчитать промежуточный котроль");
            Console.WriteLine("         3. Экзамен");
            String actionKey = Console.ReadLine();
            switch (actionKey)
            {
                case "1":
                    
                    printList(new List<IPrintable>(pris.PracticalTasks));
                    Console.WriteLine("Номер задания:");
                    int taskNum = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите баллы за качество, баллы за срок, дату");
                    var ratingForQuality = int.Parse(Console.ReadLine());
                    var ratingForDate = int.Parse(Console.ReadLine());
                    var date = new DateTime(int.Parse(Console.ReadLine()),
                                            int.Parse(Console.ReadLine()),
                                            int.Parse(Console.ReadLine()));
                    pris.Students[studentIndex].AddPracticalTask(date, ratingForQuality, ratingForDate, pris.PracticalTasks[taskNum]);    
                    
                    break;

                case "2":

                    printList(new List<IPrintable>(pris.BoundaryControls));
                    Console.WriteLine("Номер задания:");
                    int boundaryNum = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите баллы, дату");
                    var rating = int.Parse(Console.ReadLine());
                    var boundaryDate = new DateTime(int.Parse(Console.ReadLine()),
                                            int.Parse(Console.ReadLine()),
                                            int.Parse(Console.ReadLine()));
                    pris.Students[studentIndex].AddBoundaryControl(boundaryDate, rating, pris.BoundaryControls[boundaryNum]);
                   
                    break;

                case "3":
                    Console.WriteLine("Введите дату и баллы:");

                    var examDate = new DateTime(int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()),
                                                int.Parse(Console.ReadLine()));
                    var examRating = int.Parse(Console.ReadLine());
                    pris.Students[studentIndex].AddFinalControl(examDate, examRating, pris.FinalControl);
                    break;
            }
        }

        private static void printList(List<IPrintable> list)
        {
            foreach (var item in list)
            {
                Console.Write(list.IndexOf(item)+". ");
                item.print();
                Console.WriteLine();
            }    
        }
    }
}
